package com.lzh.others.basejava.IO_18;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.StringBufferInputStream;

public class Test {
    public static void main(String[] args) throws IOException {
        //测试java 二元操作 的自动类型转换
        //https://blog.csdn.net/zhaominpro/article/details/79602329
//        byte t1 = 23;
//        byte t2 = 2;
//        byte t3 = t1 + t2;//不能通过编译

        byte[] byteArray = {-1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
        byteArrayInputStream.available();
        /**
         * return (pos < count) ? (buf[pos++] & 0xff) : -1;
         * 翻译： 字节二元运算，字节会自动转换为int类型，然后进行运算，所以 通过 & 0xff 位于运算，获得0-255之间的值，将前24位设0，后8位按原来值获取
         *
         * 来自网友的解释：
         * 因为如果byte变量如果是个负数时，转换成int，会判断byte变量的符号位是否为1，
         * 如果为1，则把转换的二进制前24为置1，其余8位按byte变量赋值。
         * 为什么使用0xFF？java默认数值常量为int类型，byte & 0xFF，0xFF及二进制表示00000000_00000000_00000000_11111111。这样就能取有效位转换成int
         */
        int read = byteArrayInputStream.read();
        while (read != -1) {
            System.out.println("read = " + read);
            read = byteArrayInputStream.read();
        }
        byteArrayInputStream.close();
        StringBufferInputStream stringBufferInputStream = new StringBufferInputStream("测试");
        int read1 = stringBufferInputStream.read();
        while (read1 != -1) {
            read1 = stringBufferInputStream.read();
            System.out.println("read1 = " + read1);
        }
        stringBufferInputStream.close();
    }
}
